﻿using System;
using System.IO;
using System.Linq;

namespace Brjnk.Common
{
    public class CsvWriter : IDisposable
    {
        private StreamWriter writer;

        public CsvWriter(string destinationPath)
        {
            writer = new StreamWriter(destinationPath);
        }

        private int columnsCount = -1;

        public void WriteHeader(params string[] headers)
        {
            if (columnsCount != -1) throw new InvalidOperationException("Funkce WriteHeader může být volána pouze jednou na začátku používání objektu.");
            if (headers == null || headers.Length == 0) throw new ArgumentException("Argument headers nemůže být null nebo prázdný");
            columnsCount = headers.Length;
            WriteValues(headers);
        }

        private void WriteValues(string[] headers)
        {
            for (int i = 0; i < headers.Length; i++)
            {
                var header = headers[i];
                writer.Write(string.Format("\"{0}\"", header));
                if (headers.Length != i + 1) writer.Write(";");
            }
            writer.WriteLine(string.Empty);
        }

        public void Write(params object[] values)
        {
            if (columnsCount == -1) throw new InvalidOperationException("Před voláním WriteLine musí být zavolána funkce WriteHeaders");
            if (values.Length != columnsCount) throw new ArgumentException("Funkci WriteLIne musí být předán stejný počet hodnot, jaký byl předán funkci WriteHeaders");
            WriteValues(values.Select(v => v.ToString()).ToArray());
        }

        public void Dispose()
        {
            writer.Dispose();
        }
    }
}